home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / ibus-table / engine / main.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  7KB  |  191 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import sys
  6. import optparse
  7. import ibus
  8. import gobject
  9. import re
  10. patt = re.compile('<\\?.*\\?>\\n')
  11. from signal import signal, SIGTERM, SIGINT
  12. import factory
  13. import tabsqlitedb
  14.  
  15. try:
  16.     db_dir = os.path.join(os.getenv('IBUS_TABLE_LOCATION'), 'tables')
  17.     icon_dir = os.path.join(os.getenv('IBUS_TABLE_LOCATION'), 'icons')
  18. except:
  19.     db_dir = '/usr/share/ibus-table/tables'
  20.     icon_dir = '/usr/share/ibus-table/icons'
  21.  
  22. opt = optparse.OptionParser()
  23. opt.set_usage('%prog --table a_table.db')
  24. opt.add_option('--table', '-t', action = 'store', type = 'string', dest = 'db', default = '', help = 'Set the IME table file, default: %default')
  25. opt.add_option('--daemon', '-d', action = 'store_true', dest = 'daemon', default = False, help = 'Run as daemon, default: %default')
  26. opt.add_option('--ibus', '-i', action = 'store_true', dest = 'ibus', default = False, help = 'Set the IME icon file, default: %default')
  27. opt.add_option('--xml', '-x', action = 'store_true', dest = 'xml', default = False, help = 'output the engines xml part, default: %default')
  28. opt.add_option('--no-debug', '-n', action = 'store_false', dest = 'debug', default = True, help = 'redirect stdout and stderr to ~/.ibus/tables/debug.log, default: %default')
  29. (options, args) = opt.parse_args()
  30. if not (options.xml) and options.debug:
  31.     if not os.access(os.path.expanduser('~/.ibus/tables'), os.F_OK):
  32.         os.system('mkdir -p ~/.ibus/tables')
  33.     
  34.     logfile = os.path.expanduser('~/.ibus/tables/debug.log')
  35.     sys.stdout = open(logfile, 'a', 0)
  36.     sys.stderr = open(logfile, 'a', 0)
  37.     from time import strftime
  38.     print '--- ', strftime('%Y-%m-%d: %H:%M:%S'), ' ---'
  39.  
  40.  
  41. class IMApp:
  42.     
  43.     def __init__(self, dbfile, exec_by_ibus):
  44.         self._IMApp__mainloop = gobject.MainLoop()
  45.         self._IMApp__bus = ibus.Bus()
  46.         self._IMApp__bus.connect('disconnected', self._IMApp__bus_destroy_cb)
  47.         self._IMApp__factory = factory.EngineFactory(self._IMApp__bus, dbfile)
  48.         if exec_by_ibus:
  49.             self._IMApp__bus.request_name('org.freedesktop.IBus.Table', 0)
  50.         else:
  51.             self._IMApp__component = ibus.Component('org.freedesktop.IBus.Table', 'Table Component', '0.1.0', 'GPL', 'Yuwei Yu <acevery@gmail.com>')
  52.             name = self._IMApp__factory.db.get_ime_property('name')
  53.             longname = name
  54.             description = self._IMApp__factory.db.get_ime_property('description')
  55.             language = self._IMApp__factory.db.get_ime_property('languages')
  56.             license = self._IMApp__factory.db.get_ime_property('credit')
  57.             author = self._IMApp__factory.db.get_ime_property('author')
  58.             icon = self._IMApp__factory.db.get_ime_property('icon')
  59.             if icon:
  60.                 icon = os.path.join(icon_dir, icon)
  61.                 if not os.access(icon, os.F_OK):
  62.                     icon = ''
  63.                 
  64.             
  65.             layout = self._IMApp__factory.db.get_ime_property('layout')
  66.             self._IMApp__component.add_engine(name, longname, description, language, license, author, icon, layout)
  67.             self._IMApp__bus.register_component(self._IMApp__component)
  68.  
  69.     
  70.     def run(self):
  71.         self._IMApp__mainloop.run()
  72.  
  73.     
  74.     def quit(self):
  75.         self._IMApp__bus_destroy_cb()
  76.  
  77.     
  78.     def __bus_destroy_cb(self, bus = None):
  79.         self._IMApp__factory.do_destroy()
  80.         self._IMApp__mainloop.quit()
  81.  
  82.  
  83.  
  84. def cleanup(ima_ins):
  85.     print 'cleanup'
  86.     ima_ins.quit()
  87.     sys.exit()
  88.  
  89.  
  90. def indent(elem, level = 0):
  91.     '''Use to format xml Element pretty :)'''
  92.     i = '\n' + level * '    '
  93.     if len(elem):
  94.         if not (elem.text) or not elem.text.strip():
  95.             elem.text = i + '    '
  96.         
  97.         for e in elem:
  98.             indent(e, level + 1)
  99.             if not (e.tail) or not e.tail.strip():
  100.                 e.tail = i + '    '
  101.                 continue
  102.         
  103.         if not (e.tail) or not e.tail.strip():
  104.             e.tail = i
  105.         
  106.     elif level:
  107.         if not (elem.tail) or not elem.tail.strip():
  108.             elem.tail = i
  109.         
  110.  
  111.  
  112. def main():
  113.     if options.xml:
  114.         getdefaultlocale = getdefaultlocale
  115.         import locale
  116.         Element = Element
  117.         SubElement = SubElement
  118.         tostring = tostring
  119.         import xml.etree.ElementTree
  120.         dbs = os.listdir(db_dir)
  121.         dbs = filter((lambda x: x.endswith('.db')), dbs)
  122.         if not dbs:
  123.             return None
  124.         egs = Element('engines')
  125.         for _db in dbs:
  126.             _sq_db = tabsqlitedb.tabsqlitedb(os.path.join(db_dir, _db))
  127.             _engine = SubElement(egs, 'engine')
  128.             _name = SubElement(_engine, 'name')
  129.             _name.text = _db.replace('.db', '')
  130.             _longname = SubElement(_engine, 'longname')
  131.             _locale = getdefaultlocale()[0].lower()
  132.             _longname.text = _sq_db.get_ime_property('.'.join([
  133.                 'name',
  134.                 _locale]))
  135.             if not _longname.text:
  136.                 _longname.text = _name.text
  137.             
  138.             _language = SubElement(_engine, 'language')
  139.             _langs = _sq_db.get_ime_property('languages')
  140.             if _langs:
  141.                 _langs = _langs.split(',')
  142.                 if len(_langs) == 1:
  143.                     _language.text = _langs[0].strip()
  144.                 else:
  145.                     _language.text = _langs[0].strip().split('_')[0]
  146.             
  147.             _license = SubElement(_engine, 'license')
  148.             _license.text = _sq_db.get_ime_property('license')
  149.             _author = SubElement(_engine, 'author')
  150.             _author.text = _sq_db.get_ime_property('author')
  151.             _icon = SubElement(_engine, 'icon')
  152.             _icon_basename = _sq_db.get_ime_property('icon')
  153.             if _icon_basename:
  154.                 _icon.text = os.path.join(icon_dir, _icon_basename)
  155.             
  156.             _layout = SubElement(_engine, 'layout')
  157.             _layout.text = _sq_db.get_ime_property('layout')
  158.             _desc = SubElement(_engine, 'description')
  159.             _desc.text = _sq_db.get_ime_property('description')
  160.         
  161.         indent(egs)
  162.         egsout = tostring(egs, encoding = 'utf8')
  163.         egsout = patt.sub('', egsout)
  164.         print egsout
  165.         return 0
  166.     if options.daemon:
  167.         if os.fork():
  168.             sys.exit()
  169.         
  170.     
  171.     if options.db:
  172.         if os.access(options.db, os.F_OK):
  173.             db = options.db
  174.         else:
  175.             db = '%s%s%s' % (db_dir, os.path.sep, os.path.basename(options.db))
  176.     else:
  177.         db = ''
  178.     ima = IMApp(db, options.ibus)
  179.     signal((SIGTERM,), (lambda signum, stack_frame: cleanup(ima)))
  180.     signal((SIGINT,), (lambda signum, stack_frame: cleanup(ima)))
  181.     
  182.     try:
  183.         ima.run()
  184.     except KeyboardInterrupt:
  185.         ima.quit()
  186.  
  187.  
  188. if __name__ == '__main__':
  189.     main()
  190.  
  191.